#!/bin/sh -e
#
#    rcs_cost: approximate Rackspace Cloud Server cost (USD) of the current instance
#
#    Copyright (C) 2009-2010 Jon Bernard
#    Copyright (C) 2011 Dustin Kirkland
#
#    Author(s): Jon Bernard <jbernard@debian.org>
#               Dustin Kirkland <kirkland@byobu.co>
#
#    Derived from byobu's ec2_cost written by Dustin Kirkland, see
#    Byobu's project page: http://byobu.co for more information
#
#    This program is free software: you can redistribute it and/or modify it
#    under the terms of the GNU General Public License as published by the
#    Free Software Foundation, version 3 of the License.
#
#    This program is distributed in the hope that it will be useful, but
#    WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
#    Public License for more details.
#
#    You should have received a copy of the GNU General Public License along
#    with this program.  If not, see <http://www.gnu.org/licenses/>.

__rcs_cost_detail() {
	DETAIL=1
	__rcs_cost
}

__rcs_cost() {
	# Approximate Instance Cost Basis
	# Memory        US
	# 256MB         $0.015/h
	# 512MB         $0.030/h
	# 1024MB        $0.060/h
	# 2048MB        $0.120/h
	# 4096MB        $0.240/h
	# 8192MB        $0.480/h
	# 15872MB       $0.960/h

	# Instance memory
	memory=`grep "^MemTotal:" /proc/meminfo | awk '{print $2}'`

	# Round memory down to the nearest multiple of 64MB
	memory=$((${memory} - (${memory} % (64 * 1024))))

	# Apply the going rate
	INCREMENTS="256 512 1024 2048 4096 8192 16384 32768 65536"
	for X in ${INCREMENTS}; do
		test "$((${X} * 1024 + 65536))" -ge ${memory} && break
	done
	MEMORY_RATE=`printf "%s" "$X" | awk '{printf "%f", $1 / 256 * 15 / 1000}'`

	# Data Transfer Cost Basis
	# Incoming      $0.08/GB
	# Outgoing      $0.22/GB
	RX_RATE="0.08"
	TX_RATE="0.22"

	# Auto detect network interface
	[ -r "/proc/net/route" ] || return
	IF=$(tail -n1 /proc/net/route  | awk '{print $1}')

	ifconfig_out=`LC_ALL=C /sbin/ifconfig "$IF"`

	# Calculate bandwidth cost
	tx_gb=${ifconfig_out#*RX bytes:}
	tx_gb=$(printf "%s" ${tx_gb%% *} | awk '{ printf "%f", $1 / 1024 / 1024 / 1024 }')
	rx_gb=${ifconfig_out#*TX bytes:}
	rx_gb=$(printf "%s" ${rx_gb%% *} | awk '{ printf "%f", $1 / 1024 / 1024 / 1024 }')
	network_cost=`printf "%s" "$tx_gb" "$TX_RATE" "$rx_gb" "$RX_RATE" | awk '{printf "%f %f", $1*$2, $3*$4}' | awk '{printf "%f", $1 + $2}'`

	# Calculate uptime cost
	hours=$(((`date +%s` - `stat --printf %Z /etc/hostname`) / 60 / 60 + 1))
	uptime_cost=`printf "%s" "$hours" | awk "{printf \"%f\", "$MEMORY_RATE" * $hours}"`
	total_cost=`printf "%s %s" "$network_cost" "$uptime_cost" | awk '{printf "%.2f", $1 + $2}'`

	if [ "$DETAIL" = "1" ]; then
		echo "=========================================================="
		echo "Estimated cost in Rackspace Cloud Server since last reboot"
		echo "=========================================================="
		echo "  Network sent:  $tx_gb GB   @ \$$RX_RATE/GB"
		echo "  Network recv:  $rx_gb GB   @ \$$TX_RATE/GB"
		echo "  Network cost:  \$$network_cost"
		echo "----------------------------------------------------------"
		echo "  Uptime:        $hours hr  @ \$$MEMORY_RATE/hr"
		echo "  Uptime cost:   \$$uptime_cost"
		echo "----------------------------------------------------------"
		echo "Total cost:      ~\$$total_cost"
		echo "=========================================================="
		return
	fi

	[ -n "$total_cost" ] || return
	color K G; printf "R\$%s"; color -; color b K G; printf "%s" "$total_cost"; color --
}

# vi: syntax=sh ts=4 noexpandtab
